perm filename PIGEON[EKL,SYS]1 blob sn#818981 filedate 1986-06-13 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	the pigeon hole principle
C00003 00003	* using the inductive predicate `all' the theorem comes quickly
C00005 00004	the arithmetical pigeon hole principle: long proof
C00010 00005	the pigeon hole principle on lists
C00029 ENDMK
C⊗;
;the pigeon hole principle
(wipe-out)
(get-proofs mult)

(proof pigeonfacts)

;the arithmetical form of the pigeon hole principle

(axiom |∀f n.(∀m.m<n⊃1≤f(m))∧sum(λk.f(k),n)≤n⊃(∀m.m<n⊃1=f(k))|)
(label pigeonfact)

;the pigeon hole principle on lists

(axiom |∀setseq u.disjoint(setseq,length u)∧
                  (∀k.k<length u⊃1≤mult(u,setseq(k)))⊃
                  (∀k.k<length u⊃1=mult(u,setseq(k)))|)
(label pigeonlist)

(save-proof pigeon)
;* using the inductive predicate `all' the theorem comes quickly;
    (wipe-out)
    (get-proofs sums)
    (proof pigeonfact)

1.  (ue (a |λn.all(n,λk.1≤f(k))⊃n≤sum(λk.f(k),n)|) 
        proof_by_induction 
        (open all sum)  zeroleast 
        (use add_lesseq ue: ((n.n)(k.|f(n)|)(m.|sum(λk.f(k),n)|)) ))
    (label strictly_increasing)

2.  (ue (a |λn.all(n,λk.1≤f(k))∧sum(λk.f(k),n)=n⊃all(n,λk.1=f(k))|)
        proof_by_induction (open all sum) strictly_increasing
        (use add_one ue: ((k.|f(n)|)(n.n)(m.|sum(λk.f(k),n)|)) mode: always))
    ;∀N.ALL(N,λK.1≤F(K))∧SUM(λK.F(K),N)=N⊃ALL(N,λK.1=F(K))

;in more conventional notation:

3.  (rw * (use allfact ue: ((a.|λk.1≤f(k)|)(n.n)) mode: exact direction: reverse)
          (use allfact ue: ((a.|λk.1=f(k)|)(n.n)) mode: exact direction: reverse))
    ;∀N.(∀M.M<N⊃1≤F(M))∧SUM(λK.F(K),N)=N⊃(∀M.M<N⊃1=F(M))

;the arithmetical pigeon hole principle: long proof
    (wipe-out)
    (get-proofs sums)

    (proof pigeonfact)

1.  (assume |(∀m.m<n⊃1≤f(m))⊃n≤sum(λk.f(k),n)|)
    (label pf1)

2.  (assume |∀m.m<n'⊃1≤f(m)|)
    (label pf2)

3.  (derive |n≤sum(λk.f(k),n)|(pf1 pf2 transitivity_of_order successor1))
    (label pf3)

4.  (ue (m n) pf2 successor1)
    ;1≤F(N)
    (label pf4)

5.  (ue ((n.n)(k.|f(n)|)(m.|sum(λk.f(k),n)|)) add_lesseq (pf3 pf4))
    ;N'≤SUM(λK.F(K),N)+F(N)

6.  (ci pf2)
    ;(∀M.M<N'⊃1≤F(M))⊃N'≤SUM(λK.F(K),N)+F(N)

7.  (ci pf1)

8.  (ue (a |λn.(∀m.m<n⊃1≤f(m))⊃n≤sum(λk.f(k),n)|) proof_by_induction 
        (open sum)  zeroleast (use * mode: always))
    ;∀N.(∀M.M<N⊃1≤F(M))⊃N≤SUM(λK.F(K),N)
    (label strictly_increasing)


;other direction


9.  (assume |(∀m.m<n⊃1≤f(m))∧sum(λk.f(k),n)=n⊃(∀m.m<n⊃1=f(m))|)
    (label pfindhyp)

10. (assume |∀m.m<n'⊃1≤f(m)|)
    (label pf_assume)

11. (derive |∀m.m<n⊃1≤f(m)| (pf_assume transitivity_of_order successor1))
    (label pf10)

12. (derive |1≤f(n)| (pf_assume successor1))
    (label pf11)

13. (assume |sum(λk.f(k),n')=n'|)
    (label pf_assume)

14. (rw * (open sum))
    ;N'=SUM(λK.F(K),N)+F(N)
    (label pf12)

;the case of f(n)

15. (derive |n≤sum(λk.f(k),n)| (strictly_increasing pf10))
    (label pf13)

;use
;labels: ADD_ONE 
;(AXIOM |∀K N M.1≤K∧N'=M+K∧N≤M⊃1=K∧N=M|)

16. (ue ((k.|f(n)|)(n.n)(m.|sum(λk.f(k),n)|)) add_one 
      (pf11 pf12 pf13))
    ;1=F(N)∧N=SUM(λK.F(K),N)
    (label pf14)

;use the induction hypothesis

17. (derive |∀m.m<n⊃1=f(m)| (pfindhyp pf10 *))
    (label pf15)

18. (derive |N0=N⊃1=F(N0)| pf14)
    ;deps: (PF_ASSUME)

19. (trw |∀m.m<n'⊃1=f(m)| (use less_succ_lesseq mode: exact) 
       (open lesseq) (use normal mode: always) pf15 *)
    ;∀M.M<N'⊃1=F(M)
    ;deps: (PF_ASSUME PFINDHYP)

20. (ci pf_assume)
    ;(∀M.M<N'⊃1≤F(M))∧SUM(λK.F(K),N')=N'⊃(∀M.M<N'⊃1=F(M))
    ;deps: (PFINDHYP)

21. (ci pfindhyp)

22. (ue (a |λn.(∀m.m<n⊃1≤f(m))∧sum(λk.f(k),n)=n⊃(∀m.m<n⊃1=f(m))|)
             proof_by_induction *)
    ;∀N.(∀M.M<N⊃1≤F(M))∧SUM(λK.F(K),N)=N⊃(∀M.M<N⊃1=F(M))

23. (trw |∀F N.(∀M.M<N⊃1≤F(M))∧SUM(λK.F(K),N)=N⊃(∀M.M<N⊃1=F(M))| *)
    ;∀F N.((∀M.M<N⊃1≤F(M))∧SUM(λK.F(K),N)=N⊃(∀M.M<N⊃1=F(M)))

;the pigeon hole principle on lists
    (wipe-out)
    (get-proofs pigeon)

(proof pigeonlist)
1.  (assume |disjoint(setseq,length u)|)
    (label pl1)

;multiplicity less than length

2.  (ue ((u.u)(a.|un(setseq,length u)|)) length_mult)
    ;MULT(U,UN(SETSEQ,LENGTH U))≤LENGTH U
    (label pl2)

3.  (derive |sum(λm.mult(u,setseq(m)),length u)≤length u| 
            (mult_of_un_is_sum_mult pl1 pl2))
    (label pl3)

4.  (ue ((f.|λm.mult(u,setseq(m))|)(n.|length u|)) pigeonfact pl3 multfact)
    ;(∀M.M<LENGTH U⊃1≤MULT(U,SETSEQ(M)))⊃(∀M.M<LENGTH U⊃1=MULT(U,SETSEQ(K)))
    ;deps: (PL1)

;the pigeon hole principle on lists

5.  (ci pl1)
    ;DISJOINT(SETSEQ,LENGTH U)⊃
    ;((∀M.M<LENGTH U⊃1≤MULT(U,SETSEQ(M)))⊃(∀M.M<LENGTH U⊃1=MULT(U,SETSEQ(K))))